package com.itheima.health.config;

import com.itheima.health.security.MyUserDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.authentication.configurers.provisioning.InMemoryUserDetailsManagerConfigurer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private MyUserDetailsService myUserDetailsService;

    /**
     * @Author: 15041
     * @Date: 20:09 2021/1/13
     * @Parms: [auth]
     * @ReturnType: void
     *Description:创建用户
    */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //用户详情创建一个配置类
        /*InMemoryUserDetailsManagerConfigurer<AuthenticationManagerBuilder> configurer = auth.inMemoryAuthentication();
        //配置三个用户
        //密码格式：{算法}密文  noop表示不加密，示例中的MD5值对应的原始密码是1234
        //authorities用于提供用户的角色和权限，默认带ROLE_前缀的是角色 否则是权限
        configurer.withUser("admin").password("{noop}1234").authorities("ROLE_ADMIN");
        configurer.withUser("zhangsan").password("{noop}1234").authorities("ROLE_01","add");
        configurer.withUser("lisi").password("{MD5}81dc9bdb52d04dc20036dbd8313ed055").authorities("ROLE_02","find");*/

        //设置自定义的userDetailsService
        auth.userDetailsService(myUserDetailsService);
    }
    /**
     * @Author: 15041
     * @Date: 17:52 2021/1/13
     * @Parms: [http]
     * @ReturnType: void
     *Description: 重写配置访问控制方法 根据自己需要配置
    */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //指定访问控制规则
        //通过authorizeRequests()开启一个拦截规则
        //通过antMatchers()指定需要拦截的资源，参数为ant表达式
        //通过access()指定访问该资源所需要的权限，参数为权限表达式

        //设置后缀为 .js \ .css 的文件访问控制的资源
        http.authorizeRequests().antMatchers("*.js","*.css").access("permitAll()");
        //设置 检查项的访问权限 只有访问权限是find的可以访问
        http.authorizeRequests().antMatchers("/pages/checkitem.html").access("hasAnyAuthority('find')");
        //设置main页面登录后才可以访问 第二个为路径 /pages/** pages下的 **文件
        http.authorizeRequests().antMatchers("/main.html","/pages/**").access("isAuthenticated()");

        //使用springSecurity默认的登录配置（自动生成登录页面/登录接口/退出接口）
        //也可以自己指定
        http.formLogin()
                .loginPage("/login.html") //指定登录页地址
                .loginProcessingUrl("/sec/login") //指定登录页请求地址
                .failureUrl("/login-fail.html") //指定登录请求失败跳转地址
                .defaultSuccessUrl("/main.html"); //指定登录成功跳转地址
        //如果使用自己定义的页面，需要关闭防止csrf攻击验证，否则页面页需要加入对应的复杂逻辑
        http.csrf().disable();
        //配置退出登录的相关配置
        http.logout().logoutUrl("/sec/logout") //指定退出登录接口
                .logoutSuccessUrl("/login.html"); //指定退出登录后跳转的页面
        //配置权限不足页面 不然每次报403不好看
        http.authorizeRequests()
                .antMatchers("/main.html","/pages/**").access("isAuthenticated()");

    }
}
